<script type="text/javascript">
'use stirct'
	// map 返回数组
	function pow(x) {
		return x * x;
	}
	var arr = [1, 2, 3, 4];
	var result = arr.map(pow);
	console.log(result); // [1, 4, 9, 16]

	// reduce, 接受带两个参数的函数
	var arr = [1,3,5,7,9];
	function add(x, y) {
		return x + y;
	}
	var result = arr.reduce(add);
	console.log(result);

	// 测试一下
	function mult(x, y) {
		return x * y;
	}
	function product(arr) {
		return arr.reduce(mult);
	}
	if (product([1, 2, 3, 4]) === 24 && product([0, 1, 2]) === 0 && product([99, 88, 77, 66]) === 44274384) {
		console.log('测试通过!');
	}
	else {
		console.log('测试失败!');
	}

	// reduce 测试2
	var arr = [1, 3, 5, 7, 9];
	var result = arr.reduce(function(x, y){
		return x*10 + y;
	});
	console.log(result);

	// reduce 测试3 字符串转数字
	function string2int(s) {
		return s.split('').map(function(x) {
			return +x; // 这样转换有什么意义...
		}).reduce(function(x, y) {
			return x*10 +y;
		})
	}
	if (string2int('0') === 0 && string2int('12345') === 12345 && string2int('12300') === 12300) {
	    // console.log(string2int.toString());
	    if (string2int.toString().indexOf('parseInt') !== -1) {
	        console.log('请勿使用parseInt()!');
	    } else if (string2int.toString().indexOf('Number') !== -1) {
	        console.log('请勿使用Number()!');
	    } else {
	        console.log('测试通过!');
	    }
	}
	else {
	    console.log('测试失败!');
	}

	// 测试4 规范字母书写
	function normalize(arr) {
		return arr.map(function(x) {
			return x.substring(0,1).toUpperCase()+x.substring(1).toLowerCase()
		})

	}

	if (normalize(['adam', 'LISA', 'barT']).toString() === ['Adam', 'Lisa', 'Bart'].toString()) {
	    console.log('测试通过!');
	}
	else {
	    console.log('测试失败!');
	}

	// 测试5
	var arr = ['1','2','3'];
	console.log(arr.map(parseInt)); // 奇怪的结果
	console.log(arr.map(x => parseInt(x))); // 
	console.log(arr.map(x => +x)); // x => +x; 匿名函数, 左边是参数, 右边是返回值

	function string2int(x, y, z) {
		console.log(x, y, z); // map 默认会传3个参数给调用的函数, 元素, 下标, 数组
		return parseInt(x); // 因此调用系统函数要小心
	}
	console.log(arr.map(string2int));
</script>